const express = require('express');
const session = require('express-session');
const path = require('path');
const app = express();
const port = 3000;

// 设置视图引擎
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));

// 静态文件目录
app.use(express.static(path.join(__dirname, 'public')));

// 解析请求体
app.use(express.urlencoded({ extended: true }));
app.use(express.json());

// 配置 session
app.use(session({
  secret: 'session_demo_secret_key', // 用于签名 session ID cookie 的密钥
  resave: false, // 强制保存 session 即使它没有变化
  saveUninitialized: false, // 强制将未初始化的 session 存储
  cookie: { 
    maxAge: 1000 * 60 * 30, // session 过期时间：30分钟
    secure: false // 如果为 true，则仅通过 HTTPS 发送 cookie
  }
}));

// 简单的用户数据（实际应用中应该使用数据库）
const users = [
  { id: 1, username: 'user1', password: 'password1' },
  { id: 2, username: 'user2', password: 'password2' }
];

// 首页路由
app.get('/', (req, res) => {
  res.render('index', { 
    user: req.session.user,
    pageTitle: 'Session 演示 - 首页'
  });
});

// 登录页面路由
app.get('/login', (req, res) => {
  // 如果已经登录，重定向到首页
  if (req.session.user) {
    return res.redirect('/');
  }
  res.render('login', { 
    error: null,
    pageTitle: 'Session 演示 - 登录'
  });
});

// 登录处理路由
app.post('/login', (req, res) => {
  const { username, password } = req.body;
  
  // 查找用户
  const user = users.find(u => u.username === username && u.password === password);
  
  if (user) {
    // 登录成功，将用户信息存储在 session 中
    req.session.user = {
      id: user.id,
      username: user.username
    };
    
    // 重定向到首页
    res.redirect('/');
  } else {
    // 登录失败
    res.render('login', { 
      error: '用户名或密码错误',
      pageTitle: 'Session 演示 - 登录'
    });
  }
});

// 注销路由
app.get('/logout', (req, res) => {
  // 销毁 session
  req.session.destroy(err => {
    if (err) {
      console.error('销毁 session 时出错:', err);
    }
    res.redirect('/');
  });
});

// 受保护的路由 - 仅登录用户可访问
app.get('/profile', (req, res) => {
  // 检查用户是否已登录
  if (!req.session.user) {
    return res.redirect('/login');
  }
  
  res.render('profile', { 
    user: req.session.user,
    pageTitle: 'Session 演示 - 个人资料'
  });
});

// Session 信息页面
app.get('/session-info', (req, res) => {
  res.render('session-info', { 
    session: req.session,
    pageTitle: 'Session 演示 - Session 信息'
  });
});

// 启动服务器
app.listen(port, () => {
  console.log(`服务器运行在 http://localhost:${port}`);
});